package com.xing.binbackend.pattern.responsibility.operation.approve;

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

@Slf4j
public abstract class ApprovalWorkflow {
    // 模板方法（含分支逻辑）
    public final void process(Request request) {
        validate(request);          // 公共校验
        preProcess(request);        // 钩子方法

        if (needParallelApproval()) { // 分支判断
            parallelApproval(request);
        } else {
            sequentialApproval(request);
        }

        postApproval(request);      // 钩子方法
        archive(request);           // 公共存档
    }

    // 必须实现的步骤
    protected abstract void validate(Request request);

    protected abstract void parallelApproval(Request request);

    // 钩子方法（可选扩展点）
    protected void preProcess(Request request) {
    }

    protected void postApproval(Request request) {
    }

    // 分支控制逻辑
    protected boolean needParallelApproval() {
        return false; // 默认串行审批
    }

    // 公共方法
    private void archive(Request request) {
        System.out.println("归档申请记录：" + request.getId());
    }

    // 在模板类中引入责任链模式：
    private final List<ApprovalHandler> handlers = new ArrayList<>();

    public void addHandler(ApprovalHandler handler) {
        handlers.add(handler);
    }

    protected void sequentialApproval(Request request) {
        handlers.forEach(h -> h.handle(request));
    }

    // 在模板方法中添加状态追踪
    private FlowState currentState;

    public final void process2(Request request) {
        try {
            currentState = FlowState.INITIAL;
            validate(request);
            currentState = FlowState.VALIDATING;

            // ...其他流程步骤

        } catch (Exception e) {
            // 记录失败时的状态
            log.error("message:{},state:{}", e.getMessage(), currentState);
            throw e;
        }
    }
}




